1. 修改项目的settings的配置
- 在 settings.py 中配置需要连接的多个数据库
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db_mysql': {
"ENGINE": "django.db.backends.mysql", # django.db.backends.所连接的数据库
"NAME": "test_db", # 数据库名称
"USER": "root", # 数据库用户名
"PASSWORD": "", # 数据库密码
"HOST": "127.0.0.1", # 数据库IP,如果是连接本机的可以直接填写 127.0.0.1 或 localhost
"POST": 3306 # 数据库端口号
}
}
2. 设置数据库的路由规则
- 如果不设置当某个视图使用了orm并且访问了该视图,那么就会出现报错

# database_router.py
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class DatabaseAppsRouter(object):
"""
A router to control all database operations on models for different
databases.
In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database.
Settings example:
DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
"""
def db_for_read(self, model, **hints):
""""Point all read operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database."""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database."""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(model._meta.app_label) == db
elif model._meta.app_label in DATABASE_MAPPING:
return False
return None
def allow_migrate(self, db, app_label, model=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
# settings.py
# DATABASE_ROUTERS = ['项目文件夹.database_router.DatabaseAppsRouter']
DATABASE_ROUTERS = ['test_dblj.database_router.DatabaseAppsRouter']
3.设置APP所对应的数据库
# settings.py
DATABASE_APPS_MAPPING = {
# 'app_name':'DATABASES配置项中所定义的数据库名',
'app01': 'default',
'app02': 'db_mysql',
}
4.创建表
# app01/models.py
from django.db import models
class UserA(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField(null=True)
class Meta:
# app_label = 'app的名字'
app_label = 'app01' # 一定要设置 app_label,因为在执行 migrate 的时候会通过 app_label 所设置的 app_name 找到它所对应的数据,如果不设置默认创建到 settings -> DATABASES -> default 所配置的数据库下
# 终端所执行的代码
python manage.py makemigrations app01 # 记录 app01 下 models.py 中所改动的内容
# 或
python manage.py makemigrations # 记录所有 app 下 models.py 中所改动的内容
# 终端所执行的代码
python manage.py migrate app01 --database default # 默认只会创建 django_migrations 和 你所定义的表,django_session、django_content_type 等都不会创建
# 如果当前app所使用的数据库是default,那么就要执行下面的代码,不能执行上面的代码
python manage.py migrate # 只在default数据库下创建 你所定义的表 和 django_session、django_content_type 等表
# app02/models.py
from django.db import models
class UserB(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField(null=True)
class Meta:
# app_label = 'app的名字'
app_label = 'app02' # 一定要设置 app_label,因为在执行 migrate 的时候会通过 app_label 所设置的 app_name 找到它所对应的数据,如果不设置默认创建到 settings -> DATABASES -> default 所配置的数据库下
# 终端所执行的代码
python manage.py makemigrations app02 # 记录 app02 下 models.py 中所改动的内容
# 或
python manage.py makemigrations # 记录所有 app 下 models.py 中所改动的内容
# 终端所执行的代码
python manage.py migrate app02 --database db_mysql # 默认只会创建 django_migrations 和 你所定义的表,django_session、django_content_type 等都不会创建